import java.io.IOException;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Cliente extends TFTP {
	
	static boolean modoVerbose = false;
	static boolean modoTrace = false;
	static boolean hayPerdidaPaquetes = false;
	static int porcentajeErroresPaquete;
	static boolean hayErroresCRC = false;
	static int porcentajeErroresCRC;
	
	public Cliente(int tamanoBuffer, int puerto) throws SocketException,UnknownHostException {
		super(tamanoBuffer, puerto, 1);
	}

	public Cliente(boolean soyServidor) {
		super(soyServidor);
	}

	public static void mostrarCabecera() {
		System.out.println("\n\nHubo un problema con los parametros de la aplicacion:");
		System.out.println("FORMA DE USO:  java Cliente [IPSERVIDOR] [PUERTOSERVIDOR] [PUERTOCLIENTE] {-v}");
		System.out.println("EJEMPLO: java Cliente 88.124.53.124 12345 12344\n\n");
	}
	
	public static void mostrarOpciones()
	{
		System.out.println("\nput) Enviar archivo");
		System.out.println("get) Recibir archivo");
	}
	
	public static void tratarArgumentos(String[] args)
	{
		for(int i=0; i<args.length;i++)
		{
			if(args[i].compareTo("-d") == 0)
			{
				hayPerdidaPaquetes = true;
				porcentajeErroresPaquete = Integer.parseInt(args[i+1]);
			}
			if(args[i].compareTo("-e") == 0)
			{
				hayErroresCRC = true;
				porcentajeErroresCRC = Integer.parseInt(args[i+1]);
			}
			if(args[i].compareTo("-t") == 0)
			{
				modoTrace = true;
			}
			if(args[i].compareTo("-v") == 0)
			{
				modoVerbose = true;
			}	
		}
	}

	public static void main(String[] args) throws IOException,ClassNotFoundException, ArrayIndexOutOfBoundsException {
		try {
			Cliente cliente = new Cliente(false);
			tratarArgumentos(args);
			cliente.ponerParametros(modoVerbose, modoTrace, hayPerdidaPaquetes,
					porcentajeErroresPaquete, hayErroresCRC, porcentajeErroresCRC);
			cliente.setIPServidor(args[0]);
			cliente.setPuertoServidor(args[1]);
			cliente.setPuertoCliente(args[2]);
			cliente.abrirSocket();
			int opcion=0;
			System.out.println("El cliente se esta ejecutando\n" +
					"Escribe \"salir\" para terminar la aplicacion.");
			mostrarOpciones();
			System.out.print("tftp> ");
			Scanner sc = new Scanner(System.in);
			String cadenaLeida = sc.nextLine();
			while(cadenaLeida.compareTo("salir")!=0)
			{
				if(cadenaLeida.compareTo("get")==0)
					opcion = 1;
				else if(cadenaLeida.compareTo("put")==0)
					opcion = 2;
					
				cliente.transferenciaAcabada = false;
				cliente.setSiguientePaquete(opcion);
				while(!cliente.transferenciaAcabada)
				{
					cliente.prepararPaquete(cliente.getSiguienteTipoPaquete());
					cliente.enviarPaqueteUDP();
					cliente.recibirPaqueteUDP();
				}
			System.out.print("tftp> ");
			cadenaLeida = sc.nextLine();
			}
			cliente.cerrarSocket();
			System.out.println("El cliente ha terminado satisfactoriamente");
		} catch (ArrayIndexOutOfBoundsException e) {
			mostrarCabecera();
		}
	}
}
